package behavioral.templatemethod;

/**
 * 这是一个厨师的模板类
 * 模板类中包含了模板方法及基本方法，由基本方法组成了模板方法，模板方法制定了规则
 * 基本方法包括：抽象方法及实现方法，以及一个可选的 hook 方法（钩子方法）
 */
public abstract class Cook {

    /**
     * 这是一个模板方法，他制定了下面的过程
     */
    public void cookNoodles() {
        addWater();
        putNoodle();
        if (isAddChili()) {
            System.out.println("加入辣椒!");
        }
        finish();
    }

    /**
     * 这是一个已实现的基本方法
     */
    private void addWater() {
        System.out.println("加水");
    }

    /**
     * 这是一个抽象方法，由不同的实现者自己实现细节
     */
    abstract void putNoodle();

    /**
     * 这个是一个钩子方法，他由模板类自身默认实现，并在流程上起着控制作用。
     * 使用 protect 修饰方法，子类可以按需实现
     * @return
     */
    protected boolean isAddChili() {
        return false;
    }

    private void finish() {
        System.out.println("装盘");
    }
}
